package main

import (
	"fmt"
	"log"
	"os"
	"strings"
)

type File struct {
	Name  string `json:"name"`
	Path  string `json:"path"`
	IsDir bool   `json:"is_dir"`
	Child []File `json:"child"`
}

func getDirFiles(path string, deep bool) ([]File, error) {
	var files []File

	entries, err := os.ReadDir(path)
	if err != nil {
		return files, err
	}
	for _, dirEntity := range entries {
		if dirEntity.Name() == ".git" || dirEntity.Name() == ".gitignore" || dirEntity.Name() == ".vscode" {
			continue
		}
		var entity = File{
			Name:  dirEntity.Name(),
			IsDir: dirEntity.IsDir(),
			Path:  path,
		}
		// 不获取字子目录以及文件
		if deep {
			if dirEntity.IsDir() {
				child, _ := getDirFiles(fmt.Sprintf("%s/%s", path, dirEntity.Name()), deep)
				entity.Child = append(entity.Child, child...)
			}
		}

		files = append(files, entity)
	}
	return files, nil
}

// createDirAndFile 创建目录以及文件
func createDirAndFile(files []File, writeDir string) {
	for _, v := range files {
		filePath := fmt.Sprintf("%s/%s", v.Path, v.Name)
		dir := strings.ReplaceAll(filePath, "/Users/oo7/Developer/demo-code/", "")
		if v.IsDir {
			// 如果是目录，创建目录，并获取目录下面的文件
			makeDir := fmt.Sprintf("%s/%s", writeDir, dir)
			if err := os.MkdirAll(makeDir, os.ModePerm); err != nil {
				log.Fatalln(err)
				return
			}
			fs, _ := getDirFiles(filePath, false)
			createDirAndFile(fs, writeDir)
		} else {
			filename := fmt.Sprintf("%s/%s", writeDir, dir)
			file, err := os.Create(filename)
			if err != nil {
				log.Fatalln(err)
				return
			}
			defer file.Close()
			// 读取远程文件的内容
			data, err := os.ReadFile(filePath)
			if err != nil {
				log.Fatalln(err)
				return
			}
			if _, err := file.Write(data); err != nil {
				log.Fatalln(err)
				return
			}
		}
	}
}

func main() {
	files, _ := getDirFiles("/Users/oo7/Developer/demo-code", false)
	// rest, err := json.Marshal(files)
	// if err != nil {
	// 	log.Fatal(err)
	// }

	// fmt.Printf("%+v \n", string(rest))
	createDirAndFile(files, "/tmp/111111")
}
